home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / fpl-v13.lha / fpl / src / FPL.h < prev    next >
C/C++ Source or Header  |  1995-09-26  |  25KB  |  645 lines

  1. #ifndef FPL_H
  2. #define FPL_H
  3. /*
  4. **   $Filename: libraries/FPL.h $
  5. **   $Release: 13.7 $
  6. **   $Date: 1995/08/22 $
  7. **
  8. **   (C) Copyright 1992, 1993 by FrexxWare
  9. **       All Rights Reserved
  10. */
  11.  
  12. /************************************************************************
  13.  *                                                                      *
  14.  * fpl.library - A shared library interpreting script langauge.         *
  15.  * Copyright (C) 1992-1994 FrexxWare                                    *
  16.  * Author: Daniel Stenberg                                              *
  17.  *                                                                      *
  18.  * This program is free software; you may redistribute for non          *
  19.  * commercial purposes only. Commercial programs must have a written    *
  20.  * permission from the author to use FPL. FPL is *NOT* public domain!   *
  21.  * Any provided source code is only for reference and for assurance     *
  22.  * that users should be able to compile FPL on any operating system     *
  23.  * he/she wants to use it in!                                           *
  24.  *                                                                      *
  25.  * You may not change, resource, patch files or in any way reverse      *
  26.  * engineer anything in the FPL package.                                *
  27.  *                                                                      *
  28.  * This program is distributed in the hope that it will be useful,      *
  29.  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
  30.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                 *
  31.  *                                                                      *
  32.  * Daniel Stenberg                                                      *
  33.  * Ankdammsgatan 36, 4tr                                                *
  34.  * S-171 43 Solna                                                       *
  35.  * Sweden                                                               *
  36.  *                                                                      *
  37.  * FidoNet 2:201/328    email:dast@sth.frontec.se                       *
  38.  *                                                                      *
  39.  ************************************************************************/
  40.  
  41. #ifdef DEFAULT_CHAR_IS_SIGNED
  42. /*
  43.  * We introduce two new variable declarators to make all 'char' variables
  44.  * clearly stated either signed or unsigned, to remain untied by stupid
  45.  * compilers [different] defaults!
  46.  *
  47.  * (Still not properly used due to problems, beats me why!)
  48.  */
  49.  
  50. typedef signed char   schar; /* 'schar' for -127 to 128 */
  51. typedef unsigned char uchar; /* 'uchar' for 0 to 255 */
  52. #else
  53. /*
  54.  * If we use some compiler switch or default that makes 'char' unsigned,
  55.  * we can live with simply 'char' instead of 'unsigned char'.
  56.  */
  57. typedef char uchar;
  58. #endif
  59.  
  60. /*
  61.  *  OBSOLETE RETURN CODES! USE THE NEW 'FPLERR_*' ONES!!!
  62.  */
  63.  
  64. #ifndef OUTDATE_OLD
  65.  
  66. enum {
  67.   FPL_COULDNT_OPEN_DOS = 2,
  68.   FPL_DIVISION_BY_ZERO,
  69.   FPL_ILLEGAL_ANCHOR,
  70.   FPL_ILLEGAL_ARRAY,
  71.   FPL_ILLEGAL_ASSIGN,
  72.   FPL_ILLEGAL_BREAK,
  73.   FPL_ILLEGAL_CONDOP,
  74.   FPL_ILLEGAL_CONTINUE,
  75.   FPL_ILLEGAL_DECLARE,
  76.   FPL_ILLEGAL_PARAMETER,
  77.   FPL_ILLEGAL_PREOPERATION,
  78.   FPL_ILLEGAL_PROTOTYPE,
  79.   FPL_ILLEGAL_RESIZE,
  80.   FPL_ILLEGAL_STATEMENT,
  81.   FPL_ILLEGAL_VARIABLE,
  82.   FPL_INTERNAL_ERROR,
  83.   FPL_INSIDE_NOT_FOUND,
  84.   FPL_MISSING_APOSTROPHE,
  85.   FPL_MISSING_ARGUMENT,
  86.   FPL_MISSING_BRACE,
  87.   FPL_MISSING_BRACKET,
  88.   FPL_MISSING_OPERAND,
  89.   FPL_MISSING_PARENTHESES,
  90.   FPL_MISSING_SEMICOLON,
  91.   FPL_NO_ACTION,
  92.   FPL_OPEN_ERROR,
  93.   FPL_OUT_OF_MEMORY,
  94.   FPL_OUT_OF_REACH,
  95.   FPL_OUT_OF_STACK,
  96.   FPL_PROGRAM_STOPPED,
  97.   FPL_READONLY_VIOLATE,
  98.   FPL_SYNTAX_ERROR,
  99.   FPL_UNBALANCED_COMMENT,
  100.   FPL_UNEXPECTED_END,
  101.   FPL_UNMATCHED_BRACE,
  102.   FPL_IDENTIFIER_NOT_FOUND,
  103.   FPL_IDENTIFIER_USED,
  104.  
  105.   FPL_UNKNOWN_ERROR /* this or higher is unknown error codes! */
  106.  
  107. };
  108.  
  109. #endif
  110.  
  111. /***** ALL BY FPL SUPPLIED, IMPLEMENTED AND SUPPORTED RETURN CODES: ******/
  112. typedef enum {
  113.   FPL_OK,
  114.   FPL_EXIT_OK,         /* no error, the program stated simply exit() */
  115.   FPLERR_COULDNT_OPEN_DOS, /* NOT USED */
  116.   FPLERR_DIVISION_BY_ZERO,
  117.   FPLERR_ILLEGAL_ANCHOR,
  118.   FPLERR_ILLEGAL_ARRAY,
  119.   FPLERR_ILLEGAL_ASSIGN,
  120.   FPLERR_ILLEGAL_BREAK,
  121.   FPLERR_ILLEGAL_CONDOP,
  122.   FPLERR_ILLEGAL_CONTINUE,
  123.   FPLERR_ILLEGAL_DECLARE,
  124.   FPLERR_ILLEGAL_PARAMETER,
  125.   FPLERR_ILLEGAL_PREOPERATION,
  126.   FPLERR_ILLEGAL_PROTOTYPE,
  127.   FPLERR_ILLEGAL_RESIZE,
  128.   FPLERR_ILLEGAL_STATEMENT,
  129.   FPLERR_ILLEGAL_VARIABLE,
  130.   FPLERR_INTERNAL_ERROR,
  131.   FPLERR_INSIDE_NOT_FOUND,
  132.   FPLERR_MISSING_APOSTROPHE,
  133.   FPLERR_MISSING_ARGUMENT,
  134.   FPLERR_MISSING_BRACE,
  135.   FPLERR_MISSING_BRACKET,
  136.   FPLERR_MISSING_OPERAND,
  137.   FPLERR_MISSING_PARENTHESES,
  138.   FPLERR_MISSING_SEMICOLON,
  139.   FPLERR_NO_ACTION,
  140.   FPLERR_OPEN_ERROR,
  141.   FPLERR_OUT_OF_MEMORY,
  142.   FPLERR_OUT_OF_REACH,
  143.   FPLERR_OUT_OF_STACK,
  144.   FPLERR_PROGRAM_STOPPED,
  145.   FPLERR_READONLY_VIOLATE,
  146.   FPLERR_SYNTAX_ERROR,
  147.   FPLERR_UNBALANCED_COMMENT,
  148.   FPLERR_UNEXPECTED_END,
  149.   FPLERR_UNMATCHED_BRACE,
  150.   FPLERR_IDENTIFIER_NOT_FOUND,
  151.   FPLERR_IDENTIFIER_USED,
  152.  
  153.   FPLERR_MISSING_COLON, /* new from version 7 */
  154.   FPLERR_MISSING_WHILE, /* new from version 7 */
  155.  
  156.   /* NEW ONES FROM V11: */
  157.  
  158.   FPLERR_ILLEGAL_CASE,
  159.   FPLERR_ILLEGAL_DEFAULT,
  160.   FPLERR_UNEXPECTED_INT_STATEMENT,
  161.   FPLERR_UNEXPECTED_STRING_STATEMENT,
  162.   FPLERR_STRING_INDEX,
  163.   FPLERR_ILLEGAL_REFERENCE,
  164.   FPLERR_TOO_MANY_PARAMETERS,
  165.  
  166.   FPLERR_UNKNOWN_ERROR /* this or higher is unknown error codes! */
  167.  
  168.   } ReturnCode;
  169.  
  170. /*********************************************************************
  171.  *
  172.  * Parameter and return type defines:
  173.  *
  174.  */
  175.  
  176. #define FPL_STRVARARG     'C' /* as in 'C'haracter variable */
  177. #define FPL_INTVARARG     'N' /* as in 'N'numeric variable */
  178. #define FPL_STRVARARG_OPT (FPL_STRVARARG^32)
  179. #define FPL_INTVARARG_OPT (FPL_INTVARARG^32)
  180. #define FPL_OPTVARARG     'R' /* as in 'R'eference to C or N */
  181. #define FPL_STRARRAYVARARG 'B' /* string array reference */
  182. #define FPL_INTARRAYVARARG 'D' /* integer array reference */
  183. #define FPL_VOIDARG       'V' /* as in 'V'oid, no return values */
  184.  
  185. #define FPL_OPTARG        'A' /* like in 'A'll accepted, which then can
  186.                                  be any one of CNSI */
  187.  
  188. #define FPL_STRARG        'S' /* as in 'S'tring */
  189. #define FPL_INTARG        'I' /* as in 'I'nteger */
  190. #define FPL_OPTEXPRARG      'O' /* as in 'O'ptionally S or I */
  191. #define FPL_STRARG_OPT    (FPL_STRARG^32)
  192. #define FPL_INTARG_OPT    (FPL_INTARG^32)
  193. #define FPL_OPTARG_OPT    (FPL_OPTARG^32)
  194. #define FPL_ARGLIST       '>'
  195.  
  196. /*********************************************************************
  197.  * fplInit() and fplReset() tags:
  198.  ********************************************************************/
  199.  
  200. #define FPLTAG_END            0
  201. #define FPLTAG_DONE           0
  202. #define FPLSEND_DONE          0
  203. #define FPLSEND_END          0
  204. #define FPLREF_DONE          0
  205. #define FPLREF_END          0
  206. /* End of tag list defines! */
  207.  
  208. #define FPLTAG_INTERVAL       1 /* data is a function pointer */
  209. /* Define the interval function pointer! */
  210.  
  211. #define FPLTAG_ZERO_TERMINATE 2 /* obsolete tag from version 5*/
  212.  
  213. #define FPLTAG_STACK          3 /* data is size in bytes */
  214. /* Important only for the Amiga library version! Default startup size of the
  215.    library stack. */
  216.  
  217. #define FPLTAG_USERDATA       4 /* data is free to use to anything! */
  218. /* Userdata able to read anywhere with GetUserdata(): */
  219.  
  220. #define FPLTAG_FUNCDATA       FPLTAG_USERDATA /* data is free to use */
  221. /* Specifies private data to a specific function. */
  222.  
  223. #define FPLTAG_FUNCTION       5 /* data is a function pointer */
  224. /* fplAddFunction() tag only. function handler routine for this function. */
  225.  
  226. #define FPLTAG_MAXSTACK          6 /* OBSOLETE from version 9.5 */
  227.  
  228. #define FPLTAG_STACKLIMIT     7 /* data is size in bytes */
  229. /* (Amiga) Absolute maximum memory area used as stack by one single FPL
  230.    program. */
  231.  
  232. /* removed obsolete tag `FPLTAG_FREE' ! */
  233.  
  234. #define FPLTAG_INTERNAL_ALLOC 9 /* data is function pointer */
  235. /* To a "void *(*)(long)" (on Amiga, the parameter will be sent in d0
  236.    and *not* on the stack)! */
  237. #define FPLTAG_INTERNAL_DEALLOC 10 /* data is function pointer */
  238. /* To a "void (*)(void *, long);" (on Amiga, the parameters will be sent in
  239.    the registers a1 and d0 and *NOT* on the stack as all other functions do. */
  240.  
  241. #define FPLTAG_INTERPRET 11 /* data is a char pointer */
  242. /* To a fully FPL syntax statement to be interpreted instead of the
  243.    actual main function of the program that is about to get started. */
  244.  
  245. #define FPLTAG_STARTPOINT 12 /* data is a char pointer */
  246. /* To the alternative start position of this program. */
  247. #define FPLTAG_STARTLINE  13 /* data is integer */
  248. /* The line of the upper start point if not 1. */
  249.  
  250. #define FPLTAG_STOREGLOBALS 14 /* data is boolean */
  251. /* This enables/disables the FPL global symbol storage ability. */
  252.  
  253. #define FPLTAG_CACHEALLFILES 15 /* data is one of the defines below */
  254. /* Should FPL cache all files exporting functions? */
  255.  
  256. #define FPLTAG_CACHEFILE 16 /* data is one of the defines below */
  257. /* Should FPL cache this file. Default is FPLTAG_CACHEALLFILES or false. */
  258.  
  259. #define FPLCACHE_NONE    0 /* never cache */
  260. #define FPLCACHE_ALWAYS  1 /* always cache */
  261. #define FPLCACHE_EXPORTS 2 /* cache if symbols were exported */
  262.  
  263. #define FPLTAG_FILEID 17 /* data is a unique file identification 32-bit */
  264. /* This fileID is used by FPL. Associate this program with this fileID!
  265.    If you ever make a FPLSEND_FLUSHCACHEDFILES and this file is removed from
  266.    memory, FPL will use this when requesting the file from you!
  267.    If this file doesn't declare any `export' functions, if you never flushes
  268.    this file or if you don't allow saved export variables, this tag can be
  269.    ignored (FPL will then create a temporary fileID to use). */
  270.  
  271. #define FPLTAG_PROGNAME 18 /* data is char pointer to zero terminated name */
  272. /* When using fplExecuteScript(), FPL does not have a name for the program.
  273.    If you want anything but <unknown program> in a possible error report,
  274.    you should use this. fplEXecuteFile() automatically sets this tag, but
  275.    if you don't want the program to be named as the file name, use this tag
  276.    then too! */
  277.  
  278. #define FPLTAG_FILEGLOBALS 19 /* data is pointer to long */
  279. #define FPLTAG_ISCACHED FPLTAG_FILEGLOBALS
  280. /* Supply this tag with a pointer to a `long' and receive a zero (0) if no
  281.    global symbols was declared, or a non-zero (_not_ the number of symbols)
  282.    value if any global symbols were declared.
  283.  
  284.    If this leaves a non-zero value, it means that FPL has stored symbols
  285.    associated with this program's ID. If you do not want them, use the
  286.    {FPLSEND_FREEFILE, filename} tag to clean up. If you want to be able
  287.    to start the same program using the old global symbol values (and not
  288.    confusing the interpreter), use the same file name on next start.
  289.    */
  290.  
  291. #define FPLTAG_FILENAMEGET 20 /* data is boolean */
  292. /* This tag tells FPL that the program name is ok to use as file name to load
  293.    the program from after a flush. fplExecuteFile() uses this tag as default.
  294.    */
  295.  
  296. #define FPLTAG_MINSTACK 21 /* OBSOLETE from version 9.5 */
  297.  
  298. #define FPLTAG_LOCKUSED 22 /* OBSOLETE from version 13 */
  299.  
  300. /**** NEW FROM VERSION 5: ****/
  301.  
  302. #define FPLTAG_HASH_TABLE_SIZE 23 /* data is a long */
  303. /* This sets the hash table size. USE ONLY IN fplInit()!!! */
  304.  
  305. #define FPLTAG_NEWLINE_HOOK 24 /* data is a standard long (*)(void *); */
  306. /* Called after every newline character read. The argument is sent in register
  307.    A0 in the Amiga version. The argument is so far only the fplinit() return
  308.    code. This might be subject to change to next release!! If you intend to
  309.    use this, use caution! */
  310.  
  311. /**** NEW FROM VERSION 5.3: ****/
  312. #define FPLTAG_ALLFUNCTIONS 25 /* data is boolean */
  313. /* Enables the FPL_UNKNOWN_FUNCTION interface message. Whenever FPL finds a
  314.    function not recognized, it will still parse all arguments and call the
  315.    interface function. */
  316.  
  317. /**** NEW FROM VERSION 6: ****/
  318.  
  319. #define FPLTAG_STRING_RETURN 27 /* data is pointer to a char pointer */
  320. /* enables the top level FPL program to return a string to the calling
  321.    program in the pointer the data supplies a pointer to. NULL disables
  322.    the ability. The string should be freed using the brand new function
  323.    fplFreeString() */
  324.  
  325. /**** NEW FROM VERSION >6: ****/
  326. #define FPLTAG_NESTED_COMMENTS 28 /* data is boolean */
  327. /* This fplInit() tag makes FPL allow nested comments. Default is off. */
  328.  
  329. /**** NEW FROM VERSION 8: ****/
  330.  
  331. #define FPLTAG_REREAD_CHANGES 29 /* data is boolean */
  332. /* Alter 'reread' status of files */
  333.  
  334. #define FPLTAG_FLUSH_NOT_IN_USE 30 /* data is boolean */
  335. /* Alter 'flush' status of files */
  336.  
  337. /**** NEW FROM VERSION 9: ****/
  338.  
  339. #define FPLTAG_IDENTITY 31 /* data is pointer to a string */
  340. /* Set host process identification string */
  341.  
  342. #define FPLTAG_DEBUG 32 /* data is boolean */
  343. /* Make this execution use debug mode from the beginning! */
  344.  
  345. #define FPLTAG_KIDNAP_CACHED 33 /* data is boolean */
  346. /* Only useful when calling fplExecuteScript():
  347.    If this program get cached, then FPL will duplicate it to keep a fair
  348.    copy of it, making no troubles for the calling program to always
  349.    free the executing program after executions! */
  350.  
  351. #define FPLTAG_ERROR_BUFFER 34 /* data is char pointer */
  352. /* Set this pointer to point to a buffer with the minimum size of
  353.    FPL_ERRORMSG_LENGTH bytes. If any FPL error occures, the buffer will
  354.    hold the FPL error message. fplGetErrorMsg() will not be necessary
  355.    if this is used! */
  356.  
  357. /**** NEW FROM VERSION 10: ****/
  358.  
  359. #define FPLTAG_PREVENT_RUNNING_SAME 35 /* data is boolean */
  360. /* Executution of a cached program (already in memory) will abort immediately
  361.    with an OK return code! FPLTAG_REREAD_CHANGES is prioritized and will
  362.    override this tag.*/
  363.  
  364. #define FPLTAG_ISOLATE 36 /* data is boolean */
  365. /* This tag is valid only for the fplExecuteXXX() functions and it makes the
  366.    program run in 'protected' mode, isolated from the other FPL programs
  367.    that might have been run eariler. Isolated programs cannot access exported
  368.    symbols, nor can they export any themselves. */
  369.  
  370. #define _FPL_DUMMY    100      /* ignore this */
  371.  
  372. /**********************************************************************
  373.  * Here follows the tags for the fplSend() function. New for V3.
  374.  *********************************************************************/
  375.  
  376. #define FPLSEND_STRING    (_FPL_DUMMY +1)
  377. /* Use this when returning a string from a user function. See FPLSEND_STRLEN */
  378.  
  379. #define FPLSEND_STRLEN  (_FPL_DUMMY +2)
  380. /* Specifies the length of the returned string. If this is -1, a strlen()
  381.    will be performed by FPL to find out the real length! */
  382.  
  383. #define FPLSEND_INT    (_FPL_DUMMY +3)
  384. /* You return an integer from the function. */
  385.  
  386. #define FPLSEND_GETRESULT (_FPL_DUMMY +4)
  387. /* You specify a pointer to a `long' to hold the result of the last interval
  388.    function call. */
  389.  
  390. #define FPLSEND_GETLINE (_FPL_DUMMY +5)
  391. /* You specify a pointer to a `long' to hold the number of the current line the
  392.    interpreter is working on. */
  393.  
  394. #define FPLSEND_GETRETURNCODE (_FPL_DUMMY +6)
  395. /* You specify a pointer to a `long'  to hold the value received by the last
  396.    return() or exit() call in the FPL program. */
  397.  
  398. #define FPLSEND_GETUSERDATA (_FPL_DUMMY +7)
  399. /* You specify a pointer to a `long'  to hold the userdata specified in the
  400.    `FPLTAG_USERDATA' tag's data field in the fplInit() call. */
  401.  
  402. #define FPLSEND_GETCOLUMN (_FPL_DUMMY +8)
  403. /* You specify a pointer to a `long'  to hold the number of the current column
  404.    the interpreter is working on. */
  405.  
  406. #define FPLSEND_FLUSHCACHE (_FPL_DUMMY +9)
  407. /* specify TRUE/FALSE wheather you want FPL to flush (empty) the internal
  408.    memory cache/queue. */
  409.  
  410. #define FPLSEND_FREEFILE (_FPL_DUMMY +10) /* data is a program name pointer */
  411. /* FPL frees all functions associated with the given program! */
  412.  
  413. #define FPLSEND_PROGRAMFILE FPLSEND_STRING
  414. /* Used when returning a program's file name to FPL. */
  415.  
  416. #define FPLSEND_PROGRAM (_FPL_DUMMY +11) /* data is pointer to an array */
  417. /* When using functions in different source files, this is one way to give
  418.    FPL information about where to find a certain function! */
  419.  
  420. #define FPLSEND_GETPROGNAME (_FPL_DUMMY +12)
  421. /* Get pointer to the last interpretated FPL program name. If any error has
  422.    occurred, this will be the failing program name! */
  423.  
  424. #define FPLSEND_CONFIRM (_FPL_DUMMY +13)
  425. /* Used to confirm the query from FPL. Currently, taht can only be
  426.    FPL_FLUSH_FILE. */
  427.  
  428. #define FPLSEND_FLUSHFILE (_FPL_DUMMY +14)
  429. /* Flush the file with the specified fileID. If no ID is specified, all unused
  430.    files will be flushed. */
  431.  
  432. #define FPLSEND_STEP (_FPL_DUMMY +15)
  433. /* Moves the current interpret position. Negative number is backwards and
  434.    positive forwards. */
  435.  
  436. #define FPLSEND_GETSTACKSIZE (_FPL_DUMMY + 16) /* data is pointer to long */
  437. /* (Amiga) Receive the current stack size! */
  438.  
  439. #define FPLSEND_GETSTACKUSED (_FPL_DUMMY + 17) /* data is pointer to long */
  440. /* (Amiga) Receive the current amount of stack used (this isn't an exact
  441.    figure) */
  442.  
  443. #define FPLSEND_SETPROGNAME (_FPL_DUMMY + 18) /* data is char pointer */
  444. /* This tag forces a new name to the current (executing) program.
  445.    See also FPLTAG_PROGNAME */
  446.  
  447. #define FPLSEND_SETFILENAMEGET (_FPL_DUMMY + 19) /* data is boolean */
  448. /* This tag sets or clears the same FPLTAG_FILENAMEGET option */
  449.  
  450. /**** NEW FOR VERSION 4: ****/
  451.  
  452. #define FPLSEND_GETSYMBOL_FUNCTIONS    (_FPL_DUMMY + 20)
  453. #define FPLSEND_GETSYMBOL_MYFUNCTIONS    (_FPL_DUMMY + 21)
  454. #define FPLSEND_GETSYMBOL_FPLFUNCTIONS    (_FPL_DUMMY + 22)
  455. #define FPLSEND_GETSYMBOL_VARIABLES    (_FPL_DUMMY + 23)
  456. #define FPLSEND_GETSYMBOL_CACHEDFILES    (_FPL_DUMMY + 24)
  457. #define FPLSEND_GETSYMBOL_FREE        (_FPL_DUMMY + 25)
  458. /* See FPL.guide for information and docs */
  459.  
  460. /**** NEW FOR VERSION 5: ****/
  461.  
  462. #define FPLSEND_GETPROG (_FPL_DUMMY + 26)
  463. /* Supply a pointer to a char pointer, and you'll get a pointer to the current
  464.    program. */
  465.  
  466. #define FPLSEND_GETINTERVAL (_FPL_DUMMY + 27)
  467. /* Supply a pointer to a function pointer, and you'll receive a pointer to the
  468.    specified interval function. */
  469.  
  470. #define FPLSEND_GETNEWLINE_HOOK (_FPL_DUMMY + 28)        /* OBSOLETE!!! */
  471.  
  472. #define FPLSEND_GETFUNCTION (_FPL_DUMMY + 29)
  473. /* Supply a pointer to a function pointer, and you'll receive a pointer to the
  474.    specified interface function. */
  475.  
  476. #define FPLSEND_GETSYMBOL_ALLVARIABLES (_FPL_DUMMY + 30)
  477. #define FPLSEND_GETSYMBOL_ALLFUNCTIONS (_FPL_DUMMY + 31)
  478. /* See FPL.guide for information */
  479.  
  480. /**** NEW FOR VERSION 5.3: ****/
  481. #define FPLSEND_GETVIRLINE (_FPL_DUMMY + 32)
  482. /* return the virtual line number in the long you send a pointer to!
  483.    NOTE: The virtual line number is most often the "real" line number of your
  484.    program. FPL counts every appearance of \x0a in the program and that makes
  485.    the VIRTUAL line number since that has nothing to do with how FPL really
  486.    counts the lines!
  487.    Future versions will be able to change this line number run-time, using the
  488.    #line - instruction!
  489.    */
  490.  
  491. #define FPLSEND_GETVIRFILE (_FPL_DUMMY + 33)
  492. /* return the virtual filename in the char pointer you send a pointer to!
  493.    NOTE: The virtual file name is most often the name of the current
  494.    executed program. 
  495.    Future versions will be able to change this line number run-time, using the
  496.    #line - instruction!
  497.    */
  498.  
  499. /**** NEW FOR VERSION 6: ****/
  500. #define FPLSEND_DONTCOPY_STRING (_FPL_DUMMY + 34)
  501. /* The string we send to FPL is allocated with fplAllocString(). */
  502.  
  503.  
  504. /**** NEW FOR VERSION 10: ****/
  505. #define FPLSEND_RESULT (_FPL_DUMMY + 35)
  506. /* Supply a pointer to a long that will get the result code of a following
  507.    query-tag, This pointer is static within FPL and is only then needed to
  508.    be set whenever it's changed! NULL is valid, but no result will be
  509.    available then!
  510.    */
  511.  
  512. #define FPLSEND_IS_FILE_CACHED (_FPL_DUMMY + 36)
  513. /* Supply a char pointer of a program name. This tag will make FPL report if
  514.    the specified program is cashed - left in memory. FPL will store the result
  515.    (TRUE or FALSE) in the long pointed to by the FPLSEND_RESULT tag.
  516.    */
  517.  
  518. #define FPLSEND_GETRETURNINT (_FPL_DUMMY + 37)
  519. /* Like FPLSEND_GETRETURNCODE, but this returns a pointer to the actual
  520.    number (long). If no value was returned, this will return NULL. */
  521.  
  522. /**** NEW FOR VERSION 12: ****/
  523.  
  524. #define FPLSEND_GETVERSION (_FPL_DUMMY + 38)
  525. /* Supply a pointer to a long to get the FPL library version */
  526.  
  527. #define FPLSEND_GETREVISION (_FPL_DUMMY + 39)
  528. /* Supply a pointer to a long to get the FPL library revision */
  529.  
  530.  /***********************************************************************
  531.   *
  532.   * Funclib defines (new from version 7) [Amiga only]
  533.   *
  534.   *****/
  535.  
  536. #define FPLLIB_NONE  0 /* nothing at all! */
  537. #define FPLLIB_FORCE (1<<0)
  538. #define FPLLIB_KEEP  (1<<1)
  539.  
  540. struct fplArgument {
  541.   /*
  542.    * Interface function argument structure...
  543.    */
  544.  
  545.   uchar *name;        /* Name */
  546.   long ID;              /* ID */
  547.   void **argv;          /* Pointer array of all arguments in the same order as
  548.                they were read. Integers are simply stored in the
  549.                pointer (read docs for info about this). */
  550.   long argc;            /* Number of members in the array above */
  551.   void *key;        /* The return code from your initial fplInit() call! */
  552.   uchar *format;    /* Pointer to the actual format string of this
  553.                function. Functions using '>' in their format
  554.                string can get quite a long string here... */
  555.   void *funcdata;    /* The same data as passed in the FPLTAG_FUNCDATA tag
  556.                of your AddFunction() call. Your possibility to
  557.                pass function specific data through the library. */
  558.   /* NEW FOR FPL 5.10 */
  559.   uchar ret;        /* Expected return type. Especially useful when
  560.                using functions with optional return types. */
  561.   /* NEW FOR V10 */
  562.   void *variable;       /* Holds the [previous] variable contents of an
  563.                            external variable. If ->argc is set, the ->argv
  564.                            will hold the optionally new contents of this
  565.                            variable */
  566. };
  567.  
  568. struct fplSymbol {
  569.   /*
  570.    * Using the functions FPLSEND_GETSYMBOL_XXXXXXX will result in a pointer
  571.    * to a structure like this!
  572.    *
  573.    * Free that pointer by FPLSEND_GETSYMBOL_FREE.
  574.    */
  575.   long num;
  576.   uchar **array;
  577. };
  578.  
  579. /****************************/
  580. /***** STRING LENGTH: *******/
  581. /****************************/
  582. /* Since the no-zero-terminated-strings theories was introduced, we can't
  583.    use a simple strlen() to get the string length. This macro will do the
  584.    job for you. (Extensively typecasted to apply to ANSI standard.)
  585.    Supply the name of the structure pointer you received in the interface
  586.    function, and the number of the string. Returns the length of that
  587.    string. */
  588. #define FPL_STRING_LENGTH(arg, n)\
  589.   ((long)*(long *)((uchar *)(arg)->argv[n]-sizeof(long)))
  590.  
  591. /* Supply a string pointer received in the interface function. Returns
  592.    the length of the FPL-string! */
  593. #define FPL_STRLEN(arg)\
  594.   ((long)*(long *)((uchar *)(arg)-sizeof(long)))
  595.  
  596. /****************************/
  597. /***** FPLARGUMENT.ID: ******/
  598. /****************************/
  599. #define FPL_GENERAL_ERROR -1
  600. /* There was an error in the interpreting.
  601.    arg->argv[0] contains the error number.
  602.    */
  603.  
  604. #define FPL_FILE_REQUEST  -2
  605. /* FPL wants a file from you that was previously flushed! The arg->argv[0]
  606.    contains the fileID of the program. Use FPLSEND_PROGRAM or
  607.    FPLSEND_PROGFILE to respond. */
  608.  
  609. #define FPL_FLUSH_FILE -3
  610. /* FPL allows you to remove the allocation associated with a certain program.
  611.    The arg->argv[0] contains the fileID. Respond with FPLSEND_CONFIRM and the
  612.    data field TRUE if you really do want to flush that program. */
  613.  
  614. #define FPL_WARNING -4
  615. /* FPL warning. ->argv[0] holds the error number. Return a fplSend() with
  616.    {FPLSEND_CONFIRM, TRUE} if you want FPL to try to continue anyway! */
  617.  
  618. #if DEVELOP
  619. #define FPL_HIJACK_READ -5
  620. /* The program accessed a variable that previously has been hijacked!
  621.    This is currently not implemented, but are tested in the laboratories! */
  622. #endif
  623.  
  624. #define FPL_UNKNOWN_FUNCTION -6 /* New from version 5.3 */
  625. /* The program has interpreted an unknown function identifier. The name
  626.    is found in the ->name member, and the parameters are read as usual via
  627.    the ->format member from the ->argc and ->argv members. ->funcdata are
  628.    reserved for future use, do not depend upon it to hold anything
  629.    particular. This is activated with FPLTAG_ALLFUNCTIONS. */
  630.  
  631. #define FPL_COMPILE -7 /* development ID */
  632.  
  633.  
  634. /****************************/
  635. /****** Limitations: ********/
  636. /****************************/
  637. /* Max length of a resulting error message: */
  638. #define FPL_ERRORMSG_LENGTH 100
  639.  
  640. #define FPLNAME "fpl.library"
  641.  
  642. #define FPL_VERSION  13
  643. #define FPL_REVISION 8
  644. #endif
  645.